/*
 * @lc app=leetcode.cn id=61 lang=javascript
 *
 * [61] 旋转链表
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
// 先计算出链表的长度，根据k和链表的长度关系，如果k和链表长度一样，
// 那么相当于旋转回了原点，不用处理直接返回head
// 否则，将链表连成环，再从尾部移动到计算后的位置（count - (k % count)），
// 再将当前节点设置为链表尾部，下一个节点为链表头部即可
var rotateRight = function(head, k) {
  if (k === 0 || !head || !head.next) {
    return head;
}
  let cur = head
  let count = 1
  while (cur.next) {
    cur = cur.next
    count ++
  }
  let add = count - (k % count)
  if (add === count) return head
  cur.next = head
  while (add--) {
    cur = cur.next
  }
  let ret = cur.next
  cur.next = null
  return ret
}
// @lc code=end

// 反转链表，变为环，再反转链表,这个思路有点多余，时间复杂度高
// var rotateRight = function(head, k) {
//   if (!head) return null
//   if (k < 1) return head
//   let {last, origin} = reverse(head)
//   last.next = origin
//   let root = origin
//   while (--k) {
//     root = root.next
//   }
//   let rootNext = root.next
//   root.next = null
//   let {origin: origin2} = reverse(rootNext)
//   return origin2
// };

// var reverse = function (origin) {
//   let last = origin
//   while (last.next) {
//     let next = last.next
//     last.next = last.next.next
//     next.next = origin
//     origin = next
//   }
//   return {last, origin}
// }

